x11: Neuter workarea in fullscreen scenarios
authorMatthias Clasen <mclasen@redhat.com>
Thu, 25 Sep 2014 00:20:00 +0000 (20:20 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 25 Sep 2014 00:31:11 +0000 (20:31 -0400)
If we have a fullscreen window that covers a monitor, desktop
chrome is not relevant for placing of menus and other popups.
Therefore, return the full monitor geometry instead of the
workarea in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=737251

gdk/x11/gdkscreen-x11.c

index 34c19896114b789c9d29faebe52715ae988b90f0..e7002130059530503e918b056e3954b33b305ea9 100644 (file)
@@ -378,6 +378,38 @@ out:
     XFree (ret_workarea);
 }
 
+static gboolean
+gdk_x11_screen_monitor_has_fullscreen_window (GdkScreen *screen,
+                                              gint       monitor)
+{
+  GList *toplevels, *l;
+  GdkWindow *window;
+  gboolean has_fullscreen;
+
+  toplevels = gdk_screen_get_toplevel_windows (screen);
+
+  has_fullscreen = FALSE;
+
+  for (l = toplevels; l; l = l->next)
+    {
+      window = l->data;
+
+      if ((gdk_window_get_state (window) & GDK_WINDOW_STATE_FULLSCREEN) == 0)
+        continue;
+
+      if (gdk_window_get_fullscreen_mode (window) == GDK_FULLSCREEN_ON_ALL_MONITORS ||
+          gdk_screen_get_monitor_at_window (screen, window) == monitor)
+        {
+          has_fullscreen = TRUE;
+          break;
+        }
+    }
+
+  g_list_free (toplevels);
+
+  return has_fullscreen;
+}
+
 static void
 gdk_x11_screen_get_monitor_workarea (GdkScreen    *screen,
                                      gint          monitor_num,
@@ -393,7 +425,8 @@ gdk_x11_screen_get_monitor_workarea (GdkScreen    *screen,
    * but the primary monitor. Since that is where the 'desktop
    * chrome' usually lives, this works ok in practice.
    */
-  if (monitor_num == GDK_X11_SCREEN (screen)->primary_monitor)
+  if (monitor_num == GDK_X11_SCREEN (screen)->primary_monitor &&
+      !gdk_x11_screen_monitor_has_fullscreen_window (screen, monitor_num))
     {
       get_work_area (screen, &workarea);
       if (gdk_rectangle_intersect (dest, &workarea, &workarea))